package br.com.financas.service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import br.com.financas.abstractions.IContaService;
import br.com.financas.abstractions.IReceitaDataService;
import br.com.financas.abstractions.IReceitaRepository;
import br.com.financas.abstractions.IReceitaService;
import br.com.financas.entity.Conta;
import br.com.financas.entity.Receita;
import br.com.financas.entity.ReceitaData;
import br.com.financas.entity.Usuario;
import br.com.financas.enumflags.EnumSituacaoFlag;
import br.com.financas.repository.ReceitaRepository;

public class ReceitaService implements IReceitaService<Receita> {
	private IReceitaRepository<Receita> receitaRepository;
	private IReceitaDataService<ReceitaData> receitaDataService;
	private IContaService<Conta> contaService;
	private List<Receita> receitaList;
	
	public ReceitaService(){
		receitaRepository =  new ReceitaRepository(manager);	
		receitaDataService =  new ReceitaDataService();
		contaService =  new ContaService();
		receitaList = new ArrayList<Receita>();
	}

	@Override
	public String validaInserir(Receita receita) throws Exception {
		String msgErro = null;
		msgErro = receita.getValor() <=0 ? "valor.invalido" : msgErro;
		
		if(msgErro ==  null)
		receitaRepository.inserir(receita);
		
		return msgErro;
	}

	@Override
	public boolean validaDeletar(Receita receita) throws Exception {
		boolean deletado = receitaRepository.deletar(receita);
		return deletado;
	}

	@Override
	public String validaAtualizar(Receita entity) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Receita> obterTodos() {
		// TODO Auto-generated method stub
		return null;
	}

	@SuppressWarnings("deprecation")
	@Override
	public String validarReceitaInserir(Receita receita, int prestacao, ReceitaData receitaData) {
		String msgErro = null;
		msgErro = receita.getValor() <=0 ? "valor.invalido" : msgErro;
		
		
		try {
			Date data =  receitaData.getData();
			
			receitaRepository.inserir(receita);
			receitaDataService.validaInserir(receitaData);
			
			if(receitaData.getSituacao() == EnumSituacaoFlag.EFETIVADA){
				efetivar(receita);
			}
			
			for(int i = 0; i < prestacao; i++){
				receitaData =  new ReceitaData();
				receitaData.setReceita(receita);
				data.setMonth(data.getMonth() + 1);
				receitaData.setData(data);
				receitaDataService.validaInserir(receitaData);
				
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return msgErro;
	}

	@Override
	public String efetivar(Receita receita) {
		Conta conta = receita.getConta();
		double novoSaldo = receita.getConta().getSaldo() + receita.getValor();
		
		conta.setSaldo(novoSaldo);
		contaService.validaAtualizar(conta);
		
		return null;
	}

	@Override
	public List<Receita> obterPorUsuario(Usuario usuario) {
		return receitaList;
	}

}
